package reflect;

import java.io.File;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.URISyntaxException;
import java.util.Arrays;

/**
 * 自动调用与当前Text2在同一个包下所有类中名字含有s的无参方法.
 */
public class Test2 {
    public static void main(String[] args) throws Exception {
//        File dir =new File(Text2.class.getResource(".").toURI());
//
//        String pack=dir.getName();
//
//        File []subs =dir.listFiles();
//        String className = null;
//        Class cls = null;
//        for(int i=0;i<subs.length;i++){
//            className =subs[i].getName().substring(0,subs[i].getName().indexOf("."));
//            cls = Class.forName(pack+"."+className);
//            Object o = cls.newInstance();
//            Method []methods =cls.getDeclaredMethods();
//            for (Method method:methods){
//                String method1 =method.getName();
//                if (method1.contains("s")&&
//                        method.getParameterCount()==0&&
//                        method.getModifiers()== Modifier.PUBLIC){
//                    method.invoke(o);
//                }
//            }
//        }
//        File dir = new File(Text2.class.getResource(".").toURI());
//        File[] subs = dir.listFiles();
//        for (int i = 0; i < subs.length; i++) {
//            Class cls = Class.forName(Text2.class.getPackage().getName() + "."
//                    + subs[i].getName().substring(0, subs[i].getName().indexOf(".")));
//            Object o = cls.newInstance();
//            Method[] methods = cls.getDeclaredMethods();
//            for (Method method : methods) {
//                String method1 = method.getName();
//                if (method1.contains("s") &&
//                        method.getParameterCount() == 0 &&
//                        method.getModifiers() == Modifier.PUBLIC) {
//                    method.invoke(o);
//                }
//            }
//        }
        //定位Test2所在的目录(包)
        File dir = new File(
                Test2.class.getResource(".").toURI()
        );
        File[] subs = dir.listFiles(f->f.getName().endsWith(".class"));
        //遍历每一个class文件
        for(File sub : subs){
            String fileName = sub.getName();//获取文件名:例如Test2.class
            String className = fileName.substring(0,fileName.indexOf("."));
            Class cls = Class.forName(Test2.class.getPackage().getName()+"."+className);
            //实例化对象
            Object o = cls.newInstance();
            Method[] methods = cls.getDeclaredMethods();
            for(Method method : methods){
                if(method.getName().contains("s")&&
                        method.getParameterCount()==0&&
                        method.getModifiers()==Modifier.PUBLIC){
                    System.out.println("自动调用"+className+"的方法:"+method.getName());
                    method.invoke(o);
                }
            }

        }
    }
}
